/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package transervfx.Vista;

import java.io.IOException;
import java.net.URL;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.beans.property.ReadOnlyBooleanProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Control;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.stage.Stage;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import recursos.img.pathRecusosIMG;
import transervfx.Dato.Entidad.Usuario;
import transervfx.Dato.Validacion.ValidacionesNivelLogico;
import transervfx.Logica.GestorUsuario;
import transervfx.Vista.XML.pathRecusosFXML;
import utilidades.number.IntegerTextField;

/**
 * FXML Controller class
 *
 * @author oscar
 */
public class CrearUsuario extends VentanaModal {
    
    

   
    
    /*Image imageError = new Image(pathRecusosIMG.class.getResourceAsStream("error.png")
    );*/
   

    
   
    
    @FXML
    private TextField nombreUsuario;
    @FXML
    private PasswordField clave;
    @FXML
    private TextField apellido;
    @FXML
    private TextField nombre;
    @FXML
    private ComboBox<String> tipoDoc;
    @FXML
    private ComboBox<String> tipo;
    @FXML
    private IntegerTextField nroDoc;
    
    
    
    private Usuario usuarioView = new Usuario();
    private BeanPathAdapter<Usuario> usuarioPA=  new BeanPathAdapter<>(usuarioView);
    
    ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();
    Validator validator = validatorFactory.getValidator();

  
     public CrearUsuario(Stage ventanaPadre,String titulo,int x, int y) {
        super( ventanaPadre, titulo, x,  y);
        init();
    }
    
    public void init() {
        // TODO
        try {
            
            //linqueo interfaz con bean
            this.bindingInterfazConBean(usuarioView);

        
        
           this.nombreUsuario.focusedProperty().addListener(this.escuchadorFoco);          
           this.apellido.focusedProperty().addListener(this.escuchadorFoco);
           this.nombre.focusedProperty().addListener(this.escuchadorFoco);
           this.clave.focusedProperty().addListener(this.escuchadorFoco);
           this.nroDoc.focusedProperty().addListener(this.escuchadorFoco);
           this.tipoDoc.focusedProperty().addListener(this.escuchadorFoco);
           this.tipo.focusedProperty().addListener(this.escuchadorFoco);
         

        } catch (NoSuchMethodException ex) {
            Logger.getLogger(CrearUsuario.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void salirEvent(ActionEvent event) {
        System.out.println(((Button) event.getSource()).getText());
        //root.getScene().getWindow().hide();
        this.close();
    }

    public void guardarEvent() throws NoSuchMethodException, IOException {

        System.out.println(usuarioView.getApellido()+" "+usuarioView.getNombre()+" "+usuarioView.getTipo()+" "+usuarioView.getTipoDoc()+" "+ usuarioView.getNombreUsuario() + " " + usuarioView.getClave()+" "+usuarioView.getNroDoc()+" ");

       
        if(validarControl(this.apellido)&validarControl(this.nombre)&validarControl(this.clave)&validarControl(this.nombreUsuario)&validarControl(this.nroDoc)&validarControl(this.tipo)&validarControl(this.tipoDoc)){
        
        GestorUsuario.getInstance().guardarUsuario(usuarioView);
        System.out.println("usuario guardado");
        ((ABMUsuario)this.ventanaPadre).actualizarTabla();
        this.close();
        
     
        }
    }
    
    

    private void bindingInterfazConBean(Usuario usuarioView) throws NoSuchMethodException {
           usuarioPA.bindBidirectional("nombreUsuario", nombreUsuario.textProperty());
           usuarioPA.bindBidirectional("clave", clave.textProperty());
           usuarioPA.bindBidirectional("tipo", tipo.valueProperty(),String.class);
           usuarioPA.bindBidirectional("nombre", nombre.textProperty());
           usuarioPA.bindBidirectional("apellido", apellido.textProperty());
           usuarioPA.bindBidirectional("nroDoc", nroDoc.numberProperty());
           usuarioPA.bindBidirectional("tipoDoc", tipoDoc.valueProperty(),String.class);
           
    }

    private void unbindingInterfazConBean(Usuario usuarioView) {
        usuarioView.unbindingALL();
    }

  
        
  
  
     private ChangeListener<Boolean> escuchadorFoco=new ChangeListener<Boolean>() {
            public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
                //si tiene el foco
                Control control=(Control) ((ReadOnlyBooleanProperty)observable).getBean();
                if(!newValue.booleanValue()) 
                {  
                   
                    System.out.println("Foco viejo"+((ReadOnlyBooleanProperty)observable).getBean());
                    validarControl(control);

                }
            }
        };

      public boolean validarControl(Control control){
          String text="";
          String nombreDelInput=control.getId();
        
         
        //  if(control==nombreUsuario){
                control.getTooltip().setText(text);
                
                Set<ConstraintViolation<Usuario>> errorsProperty = validator.validateProperty(this.usuarioView, nombreDelInput,ValidacionesNivelLogico.class);
                //retorna verdadero si no hay errores
                if(errorsProperty.isEmpty()){
       
                     control.getTooltip().setGraphic(crearImagenSuccess());
                     control.getTooltip().setText("SIN ERRORES");
                      control.setStyle("-fx-border-color: null;");
                      System.out.println(control.getStyleClass());
                    return true;
                }
                else{
                      control.getTooltip().setGraphic(crearImagenError());
                      text="ERRORES: ";
                      control.setStyle("-fx-border-color: RED;");
                     // control.getStyleClass().clear();
                     // control.getStyleClass().add("controlError");
                for (ConstraintViolation<Usuario> userError : errorsProperty) {
                      text=text+"\n"+userError.getMessage();
                 }
                
                  control.getTooltip().setText(text);
              
                 //si no tiene errores retorna verdadero
                }
          //}
          
          return false;
      }

    private ImageView crearImagenSuccess() {
        Image image = new Image(pathRecusosIMG.class.getResourceAsStream("success.png"));
        
        return new ImageView(image);
    }

    private ImageView crearImagenError() {
        Image image = new Image(pathRecusosIMG.class.getResourceAsStream("error.png"));
        return new ImageView(image);
    }
    
      @Override
    URL getURLFXML() {
          return pathRecusosFXML.class.getResource("CrearUsuarioFXML.fxml");
    }

    
   
}
